//LED发光二极管调亮度实验+按键程序+数码管显示程序
//效果：    第一个LED灯亮度通过按键来调节，数码管显示亮度值
//头文件:
#include "reg51.h"

//变量定义:
unsigned char table[]=
    		{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
					//表：共阳数码管 0-9 
//引脚定义:	
sbit LED = P2^0;	//使用第一个LED灯
sbit SMG1 = P1^0;	//定义数码管阳级控制脚，第一个
sbit SMG2 = P1^1;	//定义数码管阳级控制脚，第二个

sbit key1 = P1^7;	//定义按键1
sbit key2 = P1^6;	//定义按键2
sbit key3 = P1^5;	//定义按键3
sbit key4 = P1^4;	//定义按键4
sbit key5 = P1^3;	//定义按键5

//函数定义:
void display(unsigned char da);//定义显示函数，参数为显示内容
void delay(void); 				//延时子函时
void LEDout(unsigned char ltime);//LED输出简单PWM调制

//主函数，C语言的入口函数:	
void main(void)
{
	unsigned char ldata=0;		//作为显示的数据
	unsigned char lold=1;		//作为按键放开的凭证，1为放开，0为按下
	while(1){				//循环扫描按键及显示
		if(key1==0){		//按键1按下
			if(lold){		//是否是刚按下,是执行，否则不执行
				ldata++;	//显示数据加1
				lold=0;		//处理完，将按键视为按下
			}
		}
		else if(key2==0){	//按键2按下
			if(lold){		//是否是刚按下,是执行，否则不执行
				ldata--;	//显示数据减1
				lold=0;		////处理完，将按键视为按下
			}
		}
		else if(key3==0){	//按键3按下
			if(lold){		//是否是刚按下,是执行，否则不执行
				ldata+=10;	//显示数据加1
				lold=0;		//处理完，将按键视为按下
			}
		}
		else if(key4==0){	//按键4按下
			if(lold){		//是否是刚按下,是执行，否则不执行
				ldata-=10;	//显示数据减10
				lold=0;		//处理完，将按键视为按下
			}
		}
		else if(key5==0){	//按键5按下
			if(lold){		//是否是刚按下,是执行，否则不执行
				ldata=0;	//清0
				lold=0;		//处理完，将按键视为按下
			}
		}
		else
			lold=1;			//如果都没有按键按下，将复值1

		if(ldata>99)		//当值加到99以上，要做相应处理，因为两位数码管不能显示三位数
			ldata=0;

		display(ldata);		//显示相应的数值，这里用函数的形式调用显示
		LEDout(ldata);		//LED输出
	}
}

//显示函数，参数为显示内容
void display(unsigned char da)
{
	SMG1=0;				//选择十位数码管
	P0=table[da/10];	//获取十位值，查表输出定义好的数码管段值与P0口，显示相应的0-9
	delay();			//延时
	P0=0XFF;			//清除数码管显示，因是共阳型，所以不是0
	SMG1=1;				//关闭十位数码管

	SMG2=0;				//选择个位数码管
	P0=table[da%10];	//获取个位值，查表输出定义好的数码管段值与P0口，显示相应的0-9
	delay();			//延时
	P0=0XFF;			//清除数码管显示，因是共阳型，所以不是0
	SMG2=1;				//关闭个位数码管
}

//延时子函数,短暂延时
void delay(void){		
	unsigned char i=20;
	while(i--);
}

//LED输出,参数为刷新量
void LEDout(unsigned char ltime)//此函数相当于一个PWM调制
{
	unsigned char i=ltime;
	LED=0;
	while(i--);
	LED=1;
	i=255-ltime;
	while(i--);
}
